#ifndef LOGGER_HPP_
#define LOGGER_HPP_

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>

#define DEFAULT_MESSAGE_MODE 3
/**
 * Clase Logger encargada del acceso al archivo donde se
 * dejaran asentada la informacion concerniente a los
 * errores, avisos y exitos del programa.
 */
class Logger {
private:
	std::ofstream	log;
	int				mode;

public:
	Logger();
	virtual ~Logger();

	/**
	 * Modos de reporte de informacion del Logger:
	 *  - mode = 3 -> reporta ERROR, WARNING Y SUCCESS
	 *  - mode = 2 -> reporta ERROR Y WARNING
	 *  - mode = 1 -> reporta solo ERROR
	 */
	int open(std::string &file_log);
	int open(std::string &file_log, int mode);
	int open(const char* file_log);
	int open(const char* file_log, int mode);

	/**
	 * Reporta un mensaje de error en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 */
	void reportErrorMessage(std::string reporter_class, std::string reporter_method, std::string detail);

	/**
	 * Reporta un mensaje de error en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 */
	void reportErrorMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line);

	/**
	 * Reporta un mensaje de error en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 * @param field de tipo int, marca el campo en donde se encontro lo reportado.
	 */
	void reportErrorMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line, int field);

	/**
	 * Reporta un mensaje de aviso en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 */
	void reportWarningMessage(std::string reporter_class, std::string reporter_method, std::string detail);

	/**
	 * Reporta un mensaje de aviso en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 */
	void reportWarningMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line);

	/**
	 * Reporta un mensaje de aviso en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 * @param field de tipo int, marca el campo en donde se encontro lo reportado.
	 */
	void reportWarningMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line, int field);

	/**
	 * Reporta un mensaje de exito en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 */
	void reportSuccessMessage(std::string reporter_class, std::string reporter_method, std::string detail);

	/**
	 * Reporta un mensaje de exito en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 */
	void reportSuccessMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line);

	/**
	 * Reporta un mensaje de exito en el archivo de logs.
	 * @param reporter_class de clase std::string, es la clase del objeto que reporta el mensaje.
	 * @param reporter_method de clase std::string, es el metodo del objeto que invoca el reporte.
	 * @param detail de clase std::string, es el detalle del reporte.
	 * @param line de tipo int, marca la linea en donde se encontro lo reportado.
	 * @param field de tipo int, marca el campo en donde se encontro lo reportado.
	 */
	void reportSuccessMessage(std::string reporter_class, std::string reporter_method, std::string detail, int line, int field);
};

#endif /* LOGGER_HPP_ */
